// 定义摇杆的X轴和Y轴连接的模拟引脚
const int joystickXPin = 32;    // 摇杆X轴连接到GPIO 32
const int joystickYPin = 33;    // 摇杆Y轴连接到GPIO 33

// 定义按钮连接的数字引脚
const int buttonPin = 27;       // 按钮连接到GPIO 27

// 定义变量来存储按钮的状态和摇杆的中间值
int buttonState = 0;            // 按钮状态
int lastButtonState = 0;        // 上一次按钮状态
int toggleState = 0;            // 切换状态
int middleValue = 512;          // 中间值，对于10位ADC，中间值通常是1023的一半

void setup() {
  pinMode(joystickXPin, INPUT); // 设置摇杆X轴引脚为输入模式
  pinMode(joystickYPin, INPUT); // 设置摇杆Y轴引脚为输入模式
  pinMode(buttonPin, INPUT_PULLUP); // 设置按钮引脚为输入模式，并启用内部上拉电阻
  Serial.begin(9600);          // 初始化串行通信
  Serial.println("Ready!");    // 确认串口通信正常
}

void loop() {
  // 读取摇杆X轴和Y轴的模拟值
  int xValue = analogRead(joystickXPin);
  int yValue = analogRead(joystickYPin);

  // 读取按钮状态
  buttonState = digitalRead(buttonPin);

  // 如果按钮状态从高变为低（即按钮被按下），切换状态
  if (buttonState == LOW && lastButtonState == HIGH) {
    toggleState = !toggleState;
  }
  lastButtonState = buttonState;

  // 如果摇杆在中间位置，将X和Y值设置为零
  if (abs(xValue - middleValue) < 10 && abs(yValue - middleValue) < 10) {
    xValue = 0;
    yValue = 0;
  }

  // 根据切换状态输出不同的值
  if (toggleState == 1) {
    Serial.print("State: 1 | X: ");
    Serial.print(xValue);
    Serial.print(" | Y: ");
    Serial.println(yValue);
  } else {
    Serial.print("State: 0 | X: ");
    Serial.print(xValue);
    Serial.print(" | Y: ");
    Serial.println(yValue);
  }

  delay(100); // 稍作延迟
}